{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true,
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "<img src=\"https://avatars.githubusercontent.com/u/1136538?s=70&v=4\" align=\"right\"><br><br>\n",
    "## Using AnyBody from Python\n",
    "\n",
    "We will use a small open source library to help us. \n",
    "**AnyPyTools**\n",
    "\n",
    " - Handle all interaction with the console application\n",
    " \n",
    " - Create macros programatically\n",
    " \n",
    " - Run simualtions in parallel\n",
    " ![alt text](https://github.com/AnyBody-Research-Group/AnyPyTools/raw/master/docs/_static/relax.png)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# How to get started\n",
    "<br>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "### Requirements:\n",
    "\n",
    " - A Python installation\n",
    " - The `AnyPyTools` library\n",
    "<br><br>"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "source": [
    "<img src=\"anaconda_download.png\" alt=\"Download Anaconda\" width=\"30%\" align=\"right\" border=\"5\">\n",
    "\n",
    "### The easy way:\n",
    "\n",
    "Install the a Conda Python distribution.\n",
    "- https://www.anaconda.com/products/individual\n",
    "\n",
    "Has all the important scientific python packages"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "More stuff can be installed using the build-in package-manager (`conda`)\n",
    "\n",
    "    \n",
    ">``` \n",
    ">c:\\>conda config --add channels conda-forge\n",
    ">c:\\>conda install anypytools\n",
    ">```\n",
    "\n",
    "![install using conda](conda_install.png)\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# Running the console applicaiton from Python\n",
    "<br>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "## A simple example\n",
    "<br>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "slideshow": {
     "slide_type": "-"
    }
   },
   "outputs": [],
   "source": [
    "from anypytools import AnyPyProcess \n",
    "app = AnyPyProcess( )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "5a88e73de8154d1ebd0210a4dad95d6d",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "  0%|          | 0/1 [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Completed: 1\n"
     ]
    }
   ],
   "source": [
    "macrolist = [\n",
    "    'load \"Knee.any\"',\n",
    "    'classoperation Main.MyParameter \"Set Value\" --value=\"10\"',\n",
    "    'operation Main.MyStudy.Kinematics',\n",
    "    'run',\n",
    "    'exit'\n",
    "] \n",
    "\n",
    "app.start_macro(macrolist);"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "## Running multiple macros\n",
    "<br>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "fe7e68936a9c4f2b98d64012726a10a9",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "  0%|          | 0/2 [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Completed: 2\n"
     ]
    }
   ],
   "source": [
    "macrolist = [['load \"Knee.any\"',\n",
    "              'operation Main.MyStudy.Kinematics',\n",
    "              'run',\n",
    "              'exit'],\n",
    "             ['load \"Knee.any\"',\n",
    "              'operation Main.MyStudy.InverseDynamics',\n",
    "              'run',\n",
    "              'exit']]\n",
    "\n",
    "app.start_macro(macrolist); "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "## Better performance with parallelization"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "many_macros = [['load \"Knee.any\"',\n",
    "                'classoperation Main.MyParameter \"Set Value\" --value=\"10\"',\n",
    "                'operation Main.MyStudy.Kinematics',\n",
    "                'run',\n",
    "                'exit']]*40"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "many_macros"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "## Better performance with parallelization\n",
    "\n",
    "First sequentially"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "slideshow": {
     "slide_type": "-"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[****************100%******************]  40 of 40 complete"
     ]
    },
    {
     "data": {
      "text/html": [
       "<pre>Total time: 21.4 seconds</pre>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "app = AnyPyProcess(num_processes = 1)\n",
    "app.start_macro(many_macros);"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "source": [
    "Then with parallelization"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "slideshow": {
     "slide_type": "-"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[****************100%******************]  40 of 40 complete"
     ]
    },
    {
     "data": {
      "text/html": [
       "<pre>Total time: 3.7 seconds</pre>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "app = AnyPyProcess(num_processes = 10)\n",
    "app.start_macro(many_macros); "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# Getting data back from AnyBody\n",
    "<br>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "Usual approach: **AnyOutputFile**, **Save all output data (HDF5 file)**\n",
    " - :( Difficult to concatenate data across simulations.\n",
    " - :( Impractical if we only need a few variables. \n",
    " \n",
    "\n",
    "> There must be a better way."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "source": [
    "**``...there is... ``**"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "The console application has a class operation we can use\n",
    "\n",
    "**``` classoperation <AnyScript_variable_name> \"Dump\"```**\n",
    "\n",
    "![Dump classoperation](classoperation_dump.png)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "-"
    }
   },
   "source": [
    "AnyPyTools will automatically grab any data or error from AnyBodyCon"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [],
   "source": [
    "from anypytools import AnyPyProcess \n",
    "app = AnyPyProcess( )\n",
    "\n",
    "macrolist = [['load \"Knee.any\"',\n",
    "             'operation Main.MyStudy.InverseDynamics',\n",
    "             'run',\n",
    "             'classoperation Main.MyStudy.Output.MaxMuscleActivity \"Dump\"',\n",
    "             'exit'], \n",
    "            ['load \"Knee.any\"',\n",
    "             'operation Main.MyStudy.InverseDynamics',\n",
    "             'run',\n",
    "             'classoperation Main.MyStudy.Output.MaxMuscleActivity \"Dump\"',\n",
    "             'exit']]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "slideshow": {
     "slide_type": "-"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[****************100%******************]  2 of 2 complete"
     ]
    },
    {
     "data": {
      "text/html": [
       "<pre>Total time: 0.6 seconds</pre>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "results = app.start_macro(macrolist)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "results  "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "## Plotting the data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "%matplotlib inline\n",
    "from matplotlib.pyplot import plot "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n47zTk0OCAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x8139fd0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "max_muscle_activity = results[0]['Main.MyStudy.Output.MaxMuscleActivity']\n",
    "plot(max_muscle_activity); "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "Output behaves like default Python data types:\n",
    "\n",
    "- **`list`** and **`dictionary`** types.\n",
    "\n",
    "But with extra convenience functionality:\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "slideshow": {
     "slide_type": "-"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(100,)"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "results[0]['Main.MyStudy.Output.MaxMuscleActivity'].shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(2, 100)"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "results['Main.MyStudy.Output.MaxMuscleActivity'].shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(2, 100)"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "results['MaxMuscleActivity'].shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# Handling Errors\n",
    "<br>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "AnyPyTools will also catch Errors...\n",
    "\n",
    "Here is a macro with misspelled operation:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "macrolist = ['load \"Knee.any\"',\n",
    "             'operation Main.MyStudy.Kinematic ',\n",
    "             'run', \n",
    "             'exit']  \n",
    " "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[****************100%******************]  1 of 1 complete (1 Error)"
     ]
    },
    {
     "data": {
      "text/html": [
       "<pre>Tasks with errors: 1</pre>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre>Failed 0.36227685484711003sec :webcast/live tutorial_0 n=0 : (<a href= \"file:///C:\\Users\\mel\\webcast\\live tutorial\\_j0zjldan.log\" target=\"_blank\">_j0zjldan.log</a> <a href= \"file:///C:\\Users\\mel\\webcast\\live tutorial\" target=\"_blank\">dir</a>)</pre>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<pre>Total time: 0.4 seconds</pre>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from anypytools import AnyPyProcess \n",
    "app = AnyPyProcess( )\n",
    "\n",
    "result = app.start_macro(macrolist);"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([['Error : Main.MyStudy.Kinematic : Unresolved object.']], \n",
       "      dtype='<U51')"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "result['ERROR']  "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# Creating macro programmatically\n",
    "<br>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "### Why would we want to generate macro commands?\n",
    "\n",
    "- Individual macros can be really long and complex\n",
    "\n",
    "- Parameter and sensitivity studies may require thoudsands of different macros"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [],
   "source": [
    "%pycat \"large_macro.anymcr\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": true,
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [],
   "source": [
    "from anypytools.macro_commands import Load, OperationRun, Dump, SetValue"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "load \"Knee.any\""
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Load(\"Knee.any\") "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "classoperation Main.Model.Parameter1 \"Set Value\" --value=\"100.3\""
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "SetValue('Main.Model.Parameter1', 100.3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[load \"Knee.any\",\n",
       " classoperation Main.MyParameter \"Set Value\" --value=\"10\",\n",
       " operation Main.MyStudy.InverseDynamics\n",
       " run,\n",
       " classoperation Main.MyStudy.Output.MaxMuscleActivity \"Dump\"]"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "macrolist = [ Load('Knee.any'),\n",
    "              SetValue('Main.MyParameter', 10),\n",
    "              OperationRun('Main.MyStudy.InverseDynamics'),\n",
    "              Dump('Main.MyStudy.Output.MaxMuscleActivity')] \n",
    "macrolist"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "slideshow": {
     "slide_type": "-"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[****************100%******************]  1 of 1 complete"
     ]
    },
    {
     "data": {
      "text/html": [
       "<pre>Total time: 0.6 seconds</pre>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from anypytools import AnyPyProcess\n",
    "app = AnyPyProcess()\n",
    "app.start_macro(macrolist);"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "### Creating many macros"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We need an small helper class `AnyMacro` to wrap our macro list."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[['classoperation Main.MyModel.MyParameter \"Set Value\" --value=\"8\"'],\n",
       " ['classoperation Main.MyModel.MyParameter \"Set Value\" --value=\"8\"']]"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from anypytools import AnyMacro\n",
    "\n",
    "macrolist = AnyMacro( [ SetValue('Main.MyModel.MyParameter',8)] )\n",
    "\n",
    "macrolist.number_of_macros = 2\n",
    "macrolist"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[['classoperation Main.MyModel.MyParameter \"Set Value\" --value=\"2.2\"'],\n",
       " ['classoperation Main.MyModel.MyParameter \"Set Value\" --value=\"2.5\"'],\n",
       " ['classoperation Main.MyModel.MyParameter \"Set Value\" --value=\"2.7\"'],\n",
       " ['classoperation Main.MyModel.MyParameter \"Set Value\" --value=\"2.9\"'],\n",
       " ['classoperation Main.MyModel.MyParameter \"Set Value\" --value=\"3.1\"']]"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "parameter_list = [2.2, 2.5, 2.7, 2.9, 3.1]\n",
    "\n",
    "macrolist = [ SetValue('Main.MyModel.MyParameter',parameter_list)] \n",
    "\n",
    "AnyMacro(macrolist, number_of_macros=5) "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# A simple parameter study\n",
    "<br>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "<img src=\"https://github.com/AnyBody-Research-Group/AnyPyTools/blob/master/docs/Tutorial/knee.gif?raw=true\" alt=\"Drawing\" align=\"Right\" \n",
    "width=160 />\n",
    "Combine everything in a parameter study\n",
    "- Vary patella tendon length in toy model (2 cm  to 8 cm)\n",
    "\n",
    "\n",
    "Observe the effect on maximum muscle activity."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [],
   "source": [
    "patella_len = [0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [],
   "source": [
    "macro = [Load('Knee.any'),\n",
    "         SetValue('Main.MyModel.PatellaLigament.DriverPos', patella_len ),\n",
    "         OperationRun('Main.MyStudy.InverseDynamics'),\n",
    "         Dump('Main.MyStudy.Output.Abscissa.t'), \n",
    "         Dump('Main.MyModel.PatellaLigament.DriverPos'),\n",
    "         Dump('Main.MyStudy.Output.MaxMuscleActivity')]\n",
    "\n",
    "parameter_study_macro = AnyMacro(macro, number_of_macros= 7 )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "parameter_study_macro  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[****************100%******************]  7 of 7 complete"
     ]
    },
    {
     "data": {
      "text/html": [
       "<pre>Total time: 1.7 seconds</pre>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from anypytools import AnyPyProcess\n",
    "app = AnyPyProcess()\n",
    "\n",
    "output = app.start_macro(parameter_study_macro)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {
    "collapsed": true,
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [],
   "source": [
    "%matplotlib inline\n",
    "from matplotlib.pyplot import plot, title, xlabel, legend, ylabel"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {
    "slideshow": {
     "slide_type": "-"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\nNElWrlwpTqdTLMsldvtGSUl5WbZuvVZWrgyVDRv6yf79T0hOzq9iVfKgFR4slIQxCbKm1RpJ+zSt\nwrBuy5K7d+6UqzZvlgKXq2Jj335bpG9fEYej0nOasWqG3DTvJq/OX0T/Vy6/XGTePK+jNDo8785q\nvdO9dQ3pvTxy5Ej597//Xa7fmDFj5IknTr5Hv/vuO2nevHm5YefOnSt9+/Yt12/atGkyduzY0uPl\ny5dLfHx86bHT6RSllBw+fPiMuJXdJ29uxDQgAVgFPATEVhXHE88X2I+uPfujl1PtelqYa9ED0UrE\n/hfP997ADiAQXTP/AHiwnDzKvVgXEoMHi3z0kffhd6TtkJj/i5HswuzKA/7rX/oNV8HL1el2yx+2\nb5dR27aJowLhLj5eLNuu3ybruqyTjGUZFWaVl7dD9u59TNaubStr17aTvXsfk8zM78TlKhQRkczM\nTPn000/ljjvukGbNmkn37t1l8uTJsnr1anFXkLehaizLknXr1slTTz0lvXv3lqioKBkzZox89NFH\ncuLECRERcbuLJStrhezb97j88ksnWbOmlezZ87DY7ZsqTDdrZZas77leNg/dLEWpReWGcVmWjElI\nkGu2bpWiiu6hZYlcfbXIc89Veh4FjgJp+UpL+eXQL96duIgsWCDSp0/1Cr2NicYo3tnZ2bJkyRIp\nLCwUp9MpH330kQQHB8vevXvLDb9kyRJp3ry5JCYmSmZmpgwePFimTJlSbtjc3FyJi4uTWbNmSVFR\nkdjtdlm3bp2IiEydOrV+xFtO3pBewPPoEeTfexnnGk/4feh10AEmABPKhJnt8d8K9C3z+yRPoWG7\nR7z9ykm/wht1IbBmjUh8vEh1Kpyj5o6SmWsqrk2LiMi+fSLR0SK7d5frbVmW3LNrl4zYsqXCF2/W\niixZfdFq2T95v7iLzwzjchXK0aNzZOPGy2X16hayf//fJTd3S2ltbf/+/fLKK6/I4MGDJTQ0VK67\n7jp57bXXJCkpyfuTNVSLlJQUefPNN2XUqFESGhoql19+ubz00kuy2/McWJYleXkJkpQ0VdasaS0b\nNlwqhw+/LS7Xma0pbqdbDjx7QFbFrpITi0+Um5/T7Zabtm+XW3bsqLhGn5Ii0rSpyLZtldr+9sa3\nZcicIZW2DJxin1ukWzeRpUu9Ct7oaIzinZ6eLpdeeqmEhoZKRESEDBw4UL777rtS/+TkZAkJCZFD\n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\nvS0tx6WCAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x8410908>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "for data in output:\n",
    "    maxact = data['Main.MyStudy.Output.MaxMuscleActivity']\n",
    "    time = data['Main.MyStudy.Output.Abscissa.t']\n",
    "    ligament_len = data['Main.MyModel.PatellaLigament.DriverPos'][0]\n",
    "    plot(time, maxact, label = str(100* ligament_len)+' cm' )\n",
    "    \n",
    "title('Effect of changing patella tendon length')    \n",
    "xlabel('Time steps')\n",
    "ylabel('Max muscle activity')\n",
    "legend(bbox_to_anchor=(1.05, 1), loc=2);"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# Batch processing\n",
    "<br>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "The approach depends on how the AnyBody model is structured.\n",
    "\n",
    " - Setup with a single main file:\n",
    "     - Load -> Modify parameters -> run -> save results\n",
    "     - Every macro is different\n",
    "     \n",
    " - Setup with multiple main files:\n",
    "      - Each main file defines its own parameters\n",
    "      - All macros are the same. Main files in Diffent folders\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "![Batch Process model](batch_process_folder.png)\n",
    "\n",
    "<img src=\"batch_process_folder_model.png\" alt=\"Drawing\" align=\"Left\" />\n",
    "<img src=\"batch_process_mainfile.png\" alt=\"Drawing\" align=\"Right\" />"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[load \"main.any\", operation Main.Study.InverseDynamics\n",
       " run]"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from anypytools import AnyPyProcess\n",
    "from anypytools.macro_commands import Load, OperationRun\n",
    "app = AnyPyProcess(num_processes = 3)\n",
    "\n",
    "macro = [Load(\"main.any\"),\n",
    "         OperationRun('Main.Study.InverseDynamics') ]\n",
    "macro    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[****************100%******************]  9 of 9 complete"
     ]
    },
    {
     "data": {
      "text/html": [
       "<pre>Total time: 2.3 seconds</pre>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "app.start_macro(macro, search_subdirs= \"model[1-9].*main.any\" );"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# Other possiblities \n",
    "<br>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "<img src=\"MonteCarlo.svg\"\n",
    "     style=\"height: 250px; margin: 0px 20px 0px 0px; float: right; border: 2px solid gray;\"/> \n",
    "\n",
    "\n",
    "- Monte Carlo simulations\n",
    "\n",
    "- Latin hypercube sampling\n",
    "\n",
    "- Using external optimizers\n",
    "\n",
    "> Possible topics for a webcast in the fall."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "For now... read the tutorial:\n",
    "\n",
    "## **goo.gl/F6mCHC**\n",
    "\n",
    "<img src=\"https://dl.dropboxusercontent.com/u/1683635/store/tutorial.png\"\n",
    "     style=\"height: 250px; margin: 0px 20px 0px 0px; float: middle; border: 2px solid gray;\"/> "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "skip"
    }
   },
   "source": [
    "from scipy.stats.distributions import norm\n",
    "\n",
    "from anypytools import AnyPyProcess, AnyMacro\n",
    "from anypytools.macro_commands import Load, SetValue_random, OperationRun\n",
    "\n",
    "\n",
    "app = AnyPyProcess( )\n",
    "macro = AnyMacro( \n",
    "          Load( \"Knee.any\"),\n",
    "          SetValue_random('Main.MyModel.MyParameter',\n",
    "                         norm(0.1, 0.04)),\n",
    "          OperationRun('Main.MyStudy.InverseDynamics') )\n",
    "   \n",
    "app.start_macro(macro.create_macros_MonteCarlo(1000));"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "slideshow": {
     "slide_type": "skip"
    }
   },
   "outputs": [],
   "source": [
    "import seaborn as sns\n",
    "sns.set_context('talk')\n",
    "sns.set_style('whitegrid');\n",
    "%matplotlib inline\n",
    "from matplotlib.pyplot import plot, title, xlabel, legend, ylabel"
   ]
  }
 ],
 "metadata": {
  "anaconda-cloud": {},
  "celltoolbar": "Slideshow",
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
